import os
import numpy as np
import pandas as pd
import requests
from bs4 import BeautifulSoup
"""
CG模型网解析：
一、主网址https://www.cgmodel.com/works/model-list.html?sort=0  ，必须带?sort=0否则查询不了。
sort索引序号代表的就是主页上的类别
类别：全部 人物 动物 石头植物 车辆 船艇 飞机／航空器 建筑 场景 展厅 展台 美陈 舞美会议 武器 家装 工装 雕塑/文物 机械 电子电器 家具 
食品饮料 特效动画／插件 生活用具 游戏二维资源 其他
sort=0,全部模型
sort=1,人物模型
sort=2,动物
sort=3,石头植物

二、解决翻页爬的问题
查询每一页的网络路径为：https://www.cgmodel.com/works/model-list.html?rec=all&sort=2&page=2
经测试，只需要更改对应的sort值与选择对应的page即可查询对应的网页。

三、所以爬的路径地址为：
https://www.cgmodel.com/works/model-list.html?rec=all&sort={}&page={}

存储结构：
按着爬的sort即可进行分类,sort映射中文名称
按page的数组即可进行分页下载，可以进行间断性下载
已原图片名称命名图片，整个page目录下同时生成对应的映射csv文件
所以目录结构如下：
/sort 类别名称
     /page 页面号
          /图片png  page.csv该页的图片信息表
          
"""
# url='https://www.cgmodel.com/works/model-list.html?sort=9'
#
# res=requests.get(url)
# # print(res.text)
# soup=BeautifulSoup(res.text)
# sear_id='listModel'
#
#
# def download_img(img_url, save_dir):
#     # print (img_url)
#     img=os.path.split(img_url)[1]
#     img_name=os.path.splitext(img)[0]
#     save_path=os.path.join(save_dir,img)
#     header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'} # 设置http header，视情况加需要的条目，这里的token是用来鉴权的一种方式
#     r = requests.get(img_url, headers=header, stream=True)
#
#     # print(r.status_code) # 返回状态码
#     if r.status_code == 200:
#         with open(save_path,'wb') as w:
#             w.write(r.content)
#
# def ex_text(sp,search_id):
#     # text=sp.find("div",{"id":search_id})
#     text=sp.find_all("div","case_onpo03")
#     # print(text)
#     for i in text:
#     #     print(i)
#         print(i.a.img['alt'])
#         print(i.a.img['data-src'])
#         # print(type(i),"\n")
#
#
# img_url='http://img.cgmodel.com/image/2020/0807/cover/662333-1619992521.png'
# save_dir='F:\PycharmOut\CGAI\Crawler\imgs'
# download_img(img_url,save_dir)
#
# # ex_text(soup,sear_id)

class CGmodel(object):

    def __init__(self):
        super(CGmodel, self).__init__()
        self.header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36'} # 设置http header，视情况加需要的条目，这里的token是用来鉴权的一种方式

        self.sort_map={'1':'人物','2':'动物','3':'石头植物','4':'车辆','5':'船艇','6':'航空','7':'建筑','8':'场景',
                       '9':'展厅','10':'展台','11':'美陈','12':'舞美会议','13':'武器','14':'家装','15':'工装',
                       '16':'文物','17':'机械','18':'电子电器','19':'家具','20':'食品饮料','21':'特效动画','22':'生活用具',
                       '23':'游戏二维资源','24':'其他'}


    def ex_text(self,url,sort_num,page_num,save_dir):
        sort_type = self.sort_map[str(sort_num)]
        res = requests.get(url)
        sp=BeautifulSoup(res.text)
        text = sp.find_all("div", "case_onpo03")
        # print(text)
        data_list=[]
        for i in text:
            #     print(i)
            labels=i.a.img['alt']
            img_url='http:'+i.a.img['data-src']
            # print(type(i.a.img['alt']))
            # print(i.a.img['data-src'])
            img_name=os.path.split(img_url)[1]
            data_list.append([img_name,labels])
            self.download_img(sort_type,page_num,img_url,save_dir)
        return data_list


    def download_img(self,sort_type,page_num,img_url,save_dir):
        """
        :param sort_type: 模型类别
        :param page_num: 页面号
        :param img_url: 传入图片url
        :param save_dir: 保存的总目录
        :return:
        """
        img=os.path.split(img_url)[1]
        img_name=os.path.splitext(img)[0]
        img_dir=os.path.join(save_dir,sort_type,str(page_num))
        if not os.path.exists(img_dir):
            os.makedirs(img_dir)
        save_path=os.path.join(img_dir,img)
        r = requests.get(img_url, headers=self.header, stream=True)
        if r.status_code == 200:
            with open(save_path,'wb') as w:
                w.write(r.content)


    def download(self,save_dir,sort_num,start_page,end_page):
        """
        :param save_dir:   保存的目录
        :param sort_num:  类型索引,从1开始到24
        :param all_pages:  需要爬的总页面数
        :return:
        """
        sort_type=self.sort_map[str(sort_num)]
        for i in range(start_page,end_page):
            url = 'https://www.cgmodel.com/works/model-list.html?rec=all&sort={}&page={}'.format(sort_num, i)
            data_list=self.ex_text(url,sort_num,i,save_dir)
            img_dir = os.path.join(save_dir, sort_type, str(i))
            csv_name=str(i)+'.csv'
            csv_path=os.path.join(img_dir,csv_name)
            self.save_csv(csv_path,data_list)

    def save_csv(self,csv_path,data_list):
        """
        将该页的所有模型信息csv存下
        :param csv_path:  本地页面的绝对路径
        :param data_list:  数据集
        :return:
        """
        ar=np.array(data_list)
        df=pd.DataFrame(ar,columns=['imgName','label'],index=range(1,len(data_list)+1))
        df.to_csv(csv_path)


if __name__ == '__main__':
    cgmodel=CGmodel()
    save_dir='imgs'
    cgmodel.download(save_dir,1,5)

